package co.com.bean.matricula;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;

import co.com.smart.maestro.infraestructure.dto.MatriculaDTO;
import co.com.smart.maestro.infraestructure.dto.ResponseJson;
import co.com.smart.mapper.Mapper;
import co.com.smart.persistence.entity.MatriculaFacadeLocal;
import co.com.smart.persistence.entity.dto.SmartMatricula;
import co.com.smart.session.DelegateContextEJB;
import co.com.smart.utilidades.Constantes;

/**
 * Session Bean implementation class MatriculaBean
 */
@Stateless(mappedName = "ejb/MatriculaBean")
public class MatriculaBean implements MatriculaBeanLocal{
	private MatriculaFacadeLocal facade;

	public MatriculaBean() {
		facade = DelegateContextEJB.getMatriculaFacadeLocal();
	}

	@Override
	public ResponseJson insertarMatricula(MatriculaDTO matriculaDTO) {

		ResponseJson response = new ResponseJson(); 
		try {
			facade.create(Mapper.mapperSmartMatriculaToDto(matriculaDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Matricula almacenada.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Matricula almacenado.");
		} catch (Throwable e) {
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible almacenar el Matricula.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}

	@Override
	public List<MatriculaDTO> consultarAllMatricula(){
		List<MatriculaDTO> Matricula = new ArrayList<MatriculaDTO>();
		for (SmartMatricula entity : facade.findAll()) {
			if(entity.getSmfhretiro() == null){
				Matricula.add(Mapper.mapperDtoToSmartMatricula(entity));
			}
		}

		return Matricula;
	}

	@Override
	public MatriculaDTO consultarMatriculaId(MatriculaDTO matriculaDTO) {
		MatriculaDTO matricula = new MatriculaDTO();
		SmartMatricula entity  = facade.find(matriculaDTO.getScmatricula());
		if(entity != null && entity.getSmfhretiro() == null){
			matricula = Mapper.mapperDtoToSmartMatricula(entity);
		}
		return matricula;
	}

	@Override
	public ResponseJson editMatricula(MatriculaDTO matricula) {
		ResponseJson response = new ResponseJson(); 
		try {
			matricula.setFhmodificacion(new Date());
			facade.edit(Mapper.mapperSmartMatriculaToDto(matricula));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Matricula editada");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Matricula editada");
		} catch (Throwable e) {
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible editar la Matricula");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}

	@Override
	public ResponseJson removeMatricula(MatriculaDTO matricula,  boolean logic) {
		ResponseJson response = new ResponseJson(); 
		if(logic){
			try {
				matricula.setFhretiro(new Date());
				matricula.setFhmodificacion(new Date());
				facade.edit(Mapper.mapperSmartMatriculaToDto(matricula));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Matricula inactivada");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Matricula inactivada");
			} catch (Throwable e) {
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible inactivar la matricula");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}else{
			try {
				facade.remove(Mapper.mapperSmartMatriculaToDto(matricula));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Matricula eliminada");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Matricula eliminada.");
			} catch (Throwable e) {
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible eliminar la matricula.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}
		return response ;
	}
	
	@Override
	public List<MatriculaDTO> consultarMatricula(MatriculaDTO matricula) {
		List<MatriculaDTO> findMatricula = new ArrayList<MatriculaDTO>();
		for (SmartMatricula entity :facade.consultarMatricula(Mapper.mapperSmartMatriculaToDto(matricula))){
			if(entity.getSmfhretiro() == null){
				findMatricula.add(Mapper.mapperDtoToSmartMatricula(entity));
			}
		}
		return findMatricula;
	}
}